// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

package imports

import (
	"cmd/go/internal/cfg"
	"sync"
)

var (
	tags     map[string]bool
	tagsOnce sync.Once
)

// 标记返回一组对于目标平台为真的构建标记。
// 它包括GOOS、GOARCH、编译器，可能还有“cgo”，
// 释放像“go1.13”这样的标签和用户指定的构建标签。
func Tags() map[string]bool {
	tagsOnce.Do(func() {
		tags = loadTags()
	})
	return tags
}

func loadTags() map[string]bool {
	tags := map[string]bool{
		cfg.BuildContext.GOOS:     true,
		cfg.BuildContext.GOARCH:   true,
		cfg.BuildContext.Compiler: true,
	}
	if cfg.BuildContext.CgoEnabled {
		tags["cgo"] = true
	}
	for _, tag := range cfg.BuildContext.BuildTags {
		tags[tag] = true
	}
	for _, tag := range cfg.BuildContext.ReleaseTags {
		tags[tag] = true
	}
	return tags
}

var (
	anyTags     map[string]bool
	anyTagsOnce sync.Once
)

// AnyTags返回一组特殊的构建标记，这些标记几乎满足所有
// 构建标记表达式。只有“忽略”和格式错误的生成标记要求
// 这被认为是错误的。
func AnyTags() map[string]bool {
	anyTagsOnce.Do(func() {
		anyTags = map[string]bool{"*": true}
	})
	return anyTags
}
